package codec

import "io"

// Header 请求的结构体
type Header struct {
	ServiceMethod string // 服务名和方法名，service.method
	Seq           uint64 // 请求的序号，也可以认为是某个请求的 ID，用来区分不同的请求。
	Error         string // 错误信息
}

// Codec 对消息体进行编解码的接口
type Codec interface {
	io.Closer
	ReadHeader(*Header) error
	ReadBody(interface{}) error
	Write(*Header, interface{}) error
}

// 抽象出 Codec 的构造函数，客户端和服务端可以通过 Codec 的 Type 得到构造函数，从而创建 Codec 实例。
// 这部分代码和工厂模式类似，与工厂模式不同的是，返回的是构造函数，而非实例
type NewCodecFunc func(io.ReadWriteCloser) Codec

type Type string

const (
	GobType  Type = "application/gob"
	JsonType Type = "application/json"
)

var NewCodecFuncMap map[Type]NewCodecFunc

// init 初始化
func init() {
    NewCodecFuncMap = make(map[Type]NewCodecFunc)
    NewCodecFuncMap[GobType] = NewGobCodec
}
